unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, 
  Controls, Forms, Dialogs, ComCtrls, ToolWin, ImgList, 
  Menus, StdCtrls, FileCtrl, ExtCtrls;

type
  TMainForm = class(TForm)
    imgListTree: TImageList;
    imgListSmall: TImageList;
    ImgListLarge: TImageList;
    ImgListTool: TImageList;

    FolderTree: TTreeView;
    Splitter1: TSplitter;
    FileListView: TListView;

    StatusBar: TStatusBar;

    ToolBar1: TToolBar;
    toolButtExit: TToolButton;
    toolButtAbout: TToolButton;

    mMenu: TMainMenu;
    miFile: TMenuItem;
    miExit: TMenuItem;
    miView: TMenuItem;
    miViewSmall: TMenuItem;
    miViewDetail: TMenuItem;
    miViewLarge: TMenuItem;
    miViewList: TMenuItem;

    DriveBox: TDriveComboBox;

    procedure FormCreate(Sender: TObject);

    procedure FolderTreeChange(Sender: TObject;
                                                            Node: TTreeNode);

    procedure FolderTreeExpanding(Sender: TObject;
                                             Node: TTreeNode;
                                             var AllowExpansion: Boolean);

    procedure FolderTreeGetImageIndex(Sender: TObject;
                                                                         Node: TTreeNode);

    procedure FolderTreeGetSelectedIndex(
                                      Sender: TObject; Node: TTreeNode);

    procedure FileListViewDblClick(Sender: TObject);

    procedure miExitClick(Sender: TObject);
    procedure ViewClick(Sender: TObject);

    procedure toolButtExitClick(Sender: TObject);
    procedure toolButtAboutClick(Sender: TObject);
  private
    { Private declarations }
  public

 
    function GetFullPath(Node:TTreeNode):String;
    function hasSubFolder(ParentDir:String):Boolean;

    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation
uses ShellAPI;

{$R *.DFM}

procedure TMainForm.FormCreate(Sender: TObject);
var i:integer;
        node:TTreeNode;
begin
  For i:=0 to DriveBox.Items.Count-1 do begin
      node:=FolderTree.Items.Add(nil,DriveBox.Items[i]);
     FolderTree.Items.AddChild(node,'/');
  end;
end;

procedure TMainForm.FolderTreeExpanding(
                                         Sender: TObject; Node: TTreeNode;
                                         var AllowExpansion: Boolean);
var
    FileSearch:  TSearchRec;
    Dir:String;
    CurNode:TTreeNode;
begin

    Dir:=GetFullPath(Node);

   
 if node.getFirstChild<>nil then
       if node.getFirstChild.Text='/' then
    try
       FindFirst (Dir+'\*.*',faAnyFile, FileSearch);
       while FindNext(FileSearch)=0 do
       begin
          if (FileSearch.Attr = faDirectory) then
            if (FileSearch.Name<>'..') then begin
                CurNode:=FolderTree.Items.AddChild(node,
                                                                     FileSearch.Name);
                CurNode.ImageIndex:=1;
                CurNode.SelectedIndex:=1;

                if hasSubFolder(Dir+'\'+FileSearch.Name) then
                     FolderTree.Items.AddChild(CurNode,'/');
            end;

         Application.ProcessMessages;
       end;

       FindClose(FileSearch);

       node.getFirstChild.Delete;  
     except
        AllowExpansion:=False;  
     end;
end;


function TMainForm.hasSubFolder(ParentDir: 
                                                                        String): Boolean;
var
    FileSearch:  TSearchRec;

begin
   result:=false;

   FindFirst (ParentDir+'\*.*', faDirectory , 
                                                                          FileSearch);
   while FindNext(FileSearch)=0 do
   begin
      if (FileSearch.Attr = faDirectory) then
         if (FileSearch.Name<>'..') then begin
             result:=true;
             break;
         end;
   end;

   FindClose(FileSearch);

end;

procedure TMainForm.FolderTreeGetImageIndex(
                                  Sender: TObject; Node: TTreeNode);
begin
 if Node.Level=0 then  Node.ImageIndex:=0
 else Node.ImageIndex:=1;
end;

procedure TMainForm.FolderTreeGetSelectedIndex(
                                        Sender: TObject; Node: TTreeNode);
begin
 if Node.Level=0 then  Node.SelectedIndex:=0
 else Node.SelectedIndex:=2;
end;


function TMainForm.GetFullPath(Node: 
                                                                 TTreeNode): String;
var
   CurNode:TTreeNode;
   Dir:String;
begin
    Dir:=''; 
     CurNode:=Node;
    while CurNode<>nil do begin
      if CurNode.Level=0 then  
                Dir:=Copy(CurNode.Text,1,2)+Dir
      else Dir:='\'+CurNode.Text+Dir;
      
      CurNode:=CurNode.Parent;
    end;

    Result:=dir;
end;

procedure TMainForm.FolderTreeChange(Sender: TObject; 
                                                                           Node: TTreeNode);
var
    FileSearch:  TSearchRec;
    Dir:String;
    Item:TListItem;
begin
  if Copy(Node.Text,1,2)='a:' then exit;
  Dir:=GetFullPath(FolderTree.Selected);
  FileListView.Items.Clear;
  try
  FindFirst (Dir+'\*.*',faAnyFile, FileSearch);
  while FindNext(FileSearch)=0 do
  begin
      if (FileSearch.Name<>'..') then begin
         Item:=FileListView.Items.Add;
         Item.Caption:=FileSearch.Name;
         Item.SubItems.Add(IntToStr(FileSearch.size));
         Item.SubItems.Add(DateToStr(
                                              FileDateToDateTime(
                                                             FileSearch.Time)));

         if (FileSearch.Attr = faDirectory) then
               Item.ImageIndex:=0
         else
               Item.ImageIndex:=1;
      end;

         Application.ProcessMessages;
       end;

       FindClose(FileSearch);
   except
       ShowMessage('Disk read error');
   end;

   StatusBar.SimpleText:=Dir;
end;

procedure TMainForm.ViewClick(Sender: TObject);
begin
  miViewSmall.Checked:=False;
  miViewLarge.Checked:=False;
  miViewDetail.Checked:=False;
  miViewList.Checked:=False;
 (Sender as TMenuItem).Checked:=True;

 if Sender=miViewSmall then
         FileListView.ViewStyle:=vsSmallIcon;

  if Sender=miViewLarge then
         FileListView.ViewStyle:=vsIcon;

  if Sender=miViewDetail then
         FileListView.ViewStyle:=vsReport;

  if Sender=miViewList then
         FileListView.ViewStyle:=vsList;

end;

procedure TMainForm.miExitClick(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.FileListViewDblClick(
                                                            Sender: TObject);
var FilePath:string; Dir:String;
begin
   Dir:=GetFullPath(FolderTree.Selected);
   FilePath:=Dir+'\'+FileListView.Selected.Caption;
   ShellExecute(handle,'open',PChar(FilePath),'',
                                                                PChar(Dir),SW_SHOW);
end;

procedure TMainForm.toolButtExitClick(
                                                            Sender: TObject);
begin
  miExitClick(Sender); 
end;

procedure TMainForm.toolButtAboutClick(
                                                            Sender: TObject);
begin
    ShowMessage('Easy ExplorerX Version 1.0');
end;

end.
